﻿#region

using System;
using System.ComponentModel;
using System.Windows.Forms;
using APP_PGM.DB;
using APP_PGM.POCZTA;
using Obsluga.Gui;
using WMAAN.Konfiguracja;
using WMAAN.Wyliczenia;

#endregion

namespace APP_PGM.GUI.Formularze
{
    public partial class FormLadowanie : Form
    {
        private FormAplikacja _frmAplikacja;


        public FormLadowanie()
        {
            InitializeComponent();
        }

        private void FormLadowanie_Shown(object sender, EventArgs e)
        {
            lblStatus.Text = PostepUruchamiania.LadowanieModulow.Opis();

            prgPostep.Value = 0;
            prgPostep.Minimum = 0;
            prgPostep.Maximum = Enum.GetValues(typeof (PostepUruchamiania)).Length;

            timerOpoznienie.Start();
        }

        private void bwLadowanie_DoWork(object sender, DoWorkEventArgs e)
        {
            


            bwLadowanie.ReportProgress(0, PostepUruchamiania.WczytywanieKonfiguracji);
            KonfiguracjaAplikacji konfig = new KonfiguracjaAplikacji();
            konfig = konfig.Wczytaj();

            //konfig.Zapisz();
            Wiadomosci.SerwerPoczty = konfig.SerwerPoczty;

            #region Podmiana konfiguracji

            //konfig.LokalizacjaMagazynuDanych = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Magazyn");

            //konfig.SerwerFtp = new SerwerFtp();
            //konfig.SerwerFtp.Nazwa = "TestFTP";
            //konfig.SerwerFtp.Host = "localhost";
            //konfig.SerwerFtp.Port = 21;
            //konfig.SerwerFtp.Uzytkownik = "wmaan";
            //konfig.SerwerFtp.Haslo = "wmaan";

            //konfig.SerwerPoczty = new SerwerPoczty();
            //konfig.SerwerPoczty.Nazwa = "wmaan@localhost";
            //konfig.SerwerPoczty.Host = "poczta.o2.pl";
            //konfig.SerwerPoczty.Port = 465;
            //konfig.SerwerPoczty.Uzytkownik = "wmaan";
            //konfig.SerwerPoczty.Haslo = "wmaan";

            //konfig.SerwerMySQL = new SerwerMySQL();
            //konfig.SerwerMySQL.Nazwa = "root@localhost";
            //konfig.SerwerMySQL.Host = "localhost";
            //konfig.SerwerMySQL.Port = 3306;
            //konfig.SerwerMySQL.Uzytkownik = "root";
            //konfig.SerwerMySQL.Haslo = "wmaan";

            //konfig.Zapisz();

            #endregion

            bwLadowanie.ReportProgress(0, PostepUruchamiania.WeryfikacjaPolaczeniaSieciowego);
            bool okSql = konfig.SerwerMySQL.Testuj();
            bool okFtp = konfig.SerwerFtp.Testuj();
            bool okPoczta = konfig.SerwerPoczty.Testuj();

            if (!okSql)
            {
                throw new Exception("Nie można uzyskać połączenia z serwerem baz danych");
            }

            if (!okFtp)
            {
                throw new Exception("Nie można uzyskać połączenia z serwerem plików");
            }

            if (!okPoczta)
            {
                throw new Exception("Nie można uzyskać połączenia z serwerem pocztowym");
            }


            bwLadowanie.ReportProgress(0, PostepUruchamiania.PobieranieDanych);
            PGM bazaDanych = PGM.Instancja();
            bazaDanych.ParametryPolaczenia = konfig.SerwerMySQL.ParametryPolaczenia();
            bazaDanych.Aktualizuj();


            bwLadowanie.ReportProgress(0, PostepUruchamiania.Uruchamianie);
        }

        private void bwLadowanie_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            lblStatus.Text = ((PostepUruchamiania) e.UserState).Opis();
            prgPostep.PerformStep();
        }

        private void bwLadowanie_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                Komunikaty.pokazBlad(e.Error.Message +
                                     ". \nAplikacja zostanie zamknięta. Proszę się skontaktować z administratorem");
                Application.Exit();
            }
            _frmAplikacja = new FormAplikacja();
            timerOpoznienie.Start();
        }

        private void timerOpoznienie_Tick(object sender, EventArgs e)
        {
            timerOpoznienie.Stop();
            if (lblStatus.Text == PostepUruchamiania.LadowanieModulow.Opis())
            {
                bwLadowanie.RunWorkerAsync();
            }
            else if (lblStatus.Text == PostepUruchamiania.Uruchamianie.Opis())
            {
                _frmAplikacja.Init();
                _frmAplikacja.Show();

                Hide();
            }
        }

        #region Ladowanie aplikacji

        #endregion

        #region Nested type: PostepUruchamiania

        private enum PostepUruchamiania
        {
            [Description("Ładowanie modułów")] LadowanieModulow = 1,
            [Description("Wczytywanie konfiguracji")] WczytywanieKonfiguracji = 2,
            [Description("Weryfikowanie połączeń sieciowych")] WeryfikacjaPolaczeniaSieciowego = 3,
            [Description("Pobieranie danych")] PobieranieDanych = 4,
            [Description("Uruchamianie")] Uruchamianie = 5,
        }

        #endregion
    }
}